local skynet = require "skynet"
local socket = require "skynet.socket"

local function recv(id)
    local i = 0
    while (i < 3) do
        local str = socket.readline(id)
        if str then
            skynet.error("recv " .. str)
        else
            skynet.error("disconnect")
        end
        i = i + 1
    end
    socket.close(id) -- 未接收完不要关闭
    skynet.exit()
end

local function send(id) -- 不用管有没接受到数据直接发送三次
    local i = 0
    while (i < 3) do
        skynet.error("send data" .. i)
        socket.write(id, "data" .. i .. "\n")
        i = i + 1
    end
end

skynet.start(function()
    local addr = "127.0.0.1:8001"
    skynet.error("connect " .. addr)
    local id = socket.open(addr)
    assert(id)
    -- 启动读协程
    skynet.fork(recv, id)
    -- 启动写协程
    skynet.fork(send, id)
end)

-- ​ 可以看到发送请求的一方可以不受响应速度的影响直接发送，但是由于每个请求的处理时间是不一样的
--  所以接受到的响应信息并不是有序的了。这也是这种模型带来的问题，解决办法就是每个请求发送都携带一个session
--  接受到的响应信息也携带一个session，那么这样我们就能把请求与响应一一对应